//package cn.lysoy.demo.utils;
//
//import com.jcraft.jsch.*;
//import lombok.extern.slf4j.Slf4j;
//import org.springframework.beans.factory.annotation.Value;
//import org.springframework.stereotype.Component;
//
//import java.io.*;
//import java.util.Vector;
//
///**
// * @author SongYang
// */
//@Component
//@Slf4j
//public class SftpUtils {
//    //ftp服务器中的IP地址
//    private static String ip;
//
//    // 端口号
//    private static Integer port ;
//
//    //用户名
//    private static String username;
//
//    //密码
//    private static String password;
//
//    private static ChannelSftp sftp = null;
//
//    private static Session session = null;
//
//    @Value("${sftp.ip}")
//    public void setIp(String ip) {
//        SftpUtils.ip = ip;
//    }
//    @Value("${sftp.port}")
//    public void setPort(Integer port) {
//        SftpUtils.port = port;
//    }
//    @Value("${sftp.username}")
//    public void setUsername(String username) {
//        SftpUtils.username = username;
//    }
//    @Value("${sftp.password}")
//    public void setPassword(String password) {
//        SftpUtils.password = password;
//    }
//
//    public void setSftp(ChannelSftp sftp) {
//        SftpUtils.sftp = sftp;
//    }
//
//    public void setSession(Session session) {
//        SftpUtils.session = session;
//    }
//
//    /**
//     * 初始化SFTP服务器
//     */
//    private static void initSftp() {
//        JSch jsch = new JSch();
//        try{
//            //采用指定的端口连接服务器
//            session = jsch.getSession(username,ip,port);
//            if(password != null && password.length() > 0){
//                //设置登陆主机的密码
//                session.setPassword(password);
//            }
//            //优先使用 password 验证   注：session.connect()性能低，使用password验证可跳过gssapi认证，提升连接服务器速度
//            session.setConfig("PreferredAuthentications","password");
//            //设置第一次登陆的时候提示，可选值：(ask | yes | no)
//            session.setConfig("StrictHostKeyChecking","no");
//            session.connect();
//            //创建sftp通信通道
//            Channel channel = session.openChannel("sftp");
//            channel.connect();
//            sftp = (ChannelSftp) channel;
//            log.info("sftp server connect success !!");
//        }catch (JSchException e){
//            log.error("SFTP服务器连接异常！！", e);
//        }
//    }
//
//    /**
//     * 关闭SFTP连接
//     */
//    public static void logout(){
//        if(sftp != null){
//            if(sftp.isConnected()){
//                sftp.disconnect();
//                log.info("sftp is close already");
//            }
//        }
//        if(session != null){
//            if(session.isConnected()){
//                session.disconnect();
//                log.info("session is close already");
//            }
//        }
//    }
//
//    /**
//     * 将输入流上传到SFTP服务器，作为文件
//     *
//     * @param directory     上传到SFTP服务器的路径
//     * @param sftpFileName  上传到SFTP服务器后的文件名
//     * @param input         输入流
//     * @throws SftpException
//     */
//    public static boolean upload(String directory, String sftpFileName, InputStream input) throws SftpException{
//        long start = System.currentTimeMillis();
//        initSftp();
//        try{
//            //如果文件夹不存在，则创建文件夹
//            if(sftp.ls(directory) == null){
//                sftp.mkdir(directory);
//            }
//        }catch (SftpException e){
//            //创建不存在的文件夹，并切换到文件夹
//            sftp.mkdir(directory);
//            sftp.cd(directory);
//        }
//        //切换到指定文件夹
//        sftp.cd(directory);
//        sftp.put(input, sftpFileName);
//        log.info("文件上传成功！！ 耗时：{}ms",(System.currentTimeMillis() - start));
//        logout();
//        return true;
//    }
//
//    /**
//     * 上传单个文件
//     *
//     * @param directory     上传到SFTP服务器的路径
//     * @param uploadFileUrl 文件路径
//     */
//    public static boolean upload(String directory, String uploadFileUrl){
//        File file = new File(uploadFileUrl);
//        try{
//            return upload(directory, file.getName(), new FileInputStream(file));
//        }catch (FileNotFoundException | SftpException e){
//            log.error("上传文件异常！", e);
//        }return false;
//    }
//
//    /**
//     * 将byte[] 上传到SFTP服务器，作为文件
//     *           注： 从String转换成byte[] 需要指定字符集
//     *
//     * @param directory     上传到SFTP服务器的路径
//     * @param sftpFileName  上传SFTP服务器后的文件名
//     * @param bytes         字节数组
//     */
//    public static boolean upload(String directory, String sftpFileName, byte[] bytes){
//        try{
//            return upload(directory, sftpFileName, new ByteArrayInputStream(bytes));
//        }catch (SftpException e){
//            log.error("上传文件异常！", e);
//        }return false;
//    }
//
//    /**
//     * 将字符串按照指定编码格式上传到SFTP服务器
//     *
//     * @param directory       上传到SFTP服务器的路径
//     * @param sftpFileName    上传SFTP服务器后的文件名
//     * @param dataStr         字符串
//     * @param charsetName     字符串的编码格式
//     */
//    public static boolean upload(String directory, String sftpFileName, String dataStr, String charsetName){
//        try{
//            return upload(directory, sftpFileName, new ByteArrayInputStream(dataStr.getBytes(charsetName)));
//        }catch (UnsupportedEncodingException | SftpException e){
//            log.error("上传文件异常！", e);
//        }return false;
//    }
//
//    public static boolean upload(File file, String fileName, String destPath){
//        try{
//            return upload(destPath, fileName, new FileInputStream(file));
//        }catch (SftpException | FileNotFoundException e){
//            log.error("上传文件异常！", e);
//        }return false;
//    }
//
//    /**
//     * 下载文件
//     *
//     * @param directory     SFTP服务器的文件路径
//     * @param downloadFile  SFTP服务器上的文件名
//     * @param saveFile      保存到本地路径
//     */
//    public static void download(String directory, String downloadFile, String saveFile){
//        try{
//            initSftp();
//            if(directory != null && !"".equals(directory)){
//                sftp.cd(directory);
//            }
//            File file = new File(saveFile);
//            sftp.get(downloadFile, new FileOutputStream(file));
//        }catch (SftpException | FileNotFoundException e){
//            log.error("文件下载异常！", e);
//        }finally {
//            logout();
//        }
//    }
//
//    /*    *//**
//     * 下载文件
//     *
//     * @param directory     SFTP服务器的文件路径
//     * @param downloadFile  SFTP服务器上的文件名
//     * @return              字节数组
//     *//*
//    public static byte[] download(String directory, String downloadFile){
//        try{
//            if(directory != null && !"".equals(directory)){
//                sftp.cd(directory);
//            }
//            InputStream inputStream = sftp.get(downloadFile);
//            return IOUtils.toByteArray(inputStream);
//        }catch (SftpException | IOException e){
//            log.error("文件下载异常！", e);
//        }
//        return null;
//    }*/
//
//    /**
//     * 下载文件
//     *
//     * @param directory     SFTP服务器的文件路径
//     * @param downloadFile  SFTP服务器上的文件名
//     * @return              输入流
//     */
//    public static InputStream downloadStream(String directory, String downloadFile){
//        try{
//            initSftp();
//            if(directory != null && !"".equals(directory)){
//                sftp.cd(directory);
//            }
//            return sftp.get(downloadFile);
//        }catch (SftpException e){
//            log.error("文件下载异常！", e);
//        }finally {
//            logout();
//        }
//        return null;
//    }
//
//    /**
//     * 删除文件
//     *
//     * @param directory         SFTP服务器的文件路径
//     * @param deleteFileName    删除的文件名称
//     */
//    public static void delete(String directory, String deleteFileName){
//        try{
//            sftp.cd(directory);
//            sftp.rm(deleteFileName);
//        }catch (SftpException e){
//            log.error("文件删除异常！", e);
//        }
//    }
//
//    /**
//     * 删除文件夹
//     *
//     * @param directory         SFTP服务器的文件路径
//     */
//    public static void delete(String directory){
//        Vector vector = listFiles(directory);
//        vector.remove(0);
//        vector.remove(0);
//        for(Object v : vector){
//            ChannelSftp.LsEntry lsEntry = (ChannelSftp.LsEntry)v;
//            try{
//                initSftp();
//                sftp.cd(directory);
//                sftp.rm(lsEntry.getFilename());
//            }catch (SftpException e){
//                log.error("文件删除异常！", e);
//            }finally {
//                logout();
//            }
//        }
//    }
//
//    /**
//     * 获取文件夹下的文件
//     *
//     * @param directory     路径
//     * @return
//     */
//    public static Vector<?> listFiles(String directory){
//        try{
//            initSftp();
//            if(isDirExist(directory)){
//                Vector<?> vector =  sftp.ls(directory);
//                //移除上级目录和根目录："." ".."
//                vector.remove(0);
//                vector.remove(0);
//                return vector;
//            }
//        }catch (SftpException e){
//            log.error("获取文件夹信息异常！", e);
//        }finally {
//            logout();
//        }
//        return null;
//    }
//
//    /**
//     * 检测文件夹是否存在
//     *
//     * @param directory     路径
//     * @return
//     */
//    public static boolean booleanUrl(String directory){
//        try{
//            initSftp();
//            if(sftp.ls(directory) == null){
//                return false;
//            }
//        }catch (Exception e){
//            log.error("检测文件夹异常！", e);
//        }finally {
//            logout();
//        }
//        return true;
//    }
//
//    /**
//     * 创建一个文件目录
//     *
//     * @param createpath        路径
//     * @return
//     */
//    public static boolean createDir(String createpath) {
//        try {
//            initSftp();
//            if (isDirExist(createpath)) {
//                sftp.cd(createpath);
//                return true;
//            }
//            String pathArry[] = createpath.split("/");
//            StringBuffer filePath = new StringBuffer("/");
//            for (String path : pathArry) {
//                if (path.equals("")) {
//                    continue;
//                }
//                filePath.append(path + "/");
//                if (isDirExist(filePath.toString())) {
//                    sftp.cd(filePath.toString());
//                } else {
//                    // 建立目录
//                    sftp.mkdir(filePath.toString());
//                    // 进入并设置为当前目录
//                    sftp.cd(filePath.toString());
//                }
//            }
//            sftp.cd(createpath);
//        } catch (SftpException e) {
//            log.error("目录创建异常！", e);
//            return false;
//        }finally {
//            logout();
//        }
//        return true;
//    }
//
//    /**
//     * 判断目录是否存在
//     * @param directory     路径
//     * @return
//     */
//    public static boolean isDirExist(String directory) {
//        boolean isDirExistFlag = false;
//        try {
//            initSftp();
//            SftpATTRS sftpATTRS = sftp.lstat(directory);
//            return sftpATTRS.isDir();
//        } catch (Exception e) {
//            if (e.getMessage().equalsIgnoreCase("no such file")) {
//                isDirExistFlag = false;
//            }
//        }finally {
//            logout();
//        }
//        return isDirExistFlag;
//    }
//
//    /**
//     * 方法功能说明：目录不存在时创建目录
//     * @参数： @param path
//     * @return void
//     * @throws
//     */
//    public static void mkdirs(String path){
//        File file = new File(path);
//        String fs = file.getParent();
//        file = new File(fs);
//        if(!file.exists()){
//            file.mkdirs();
//        }
//    }
//    /**
//     * 判断文件或目录是否存在
//     * @param path 路径
//     * @return
//     */
//    public static boolean isExist(String path, ChannelSftp sftp){
//        boolean  isExist=false;
//        try {
//            sftp.lstat(path);
//            isExist = true;
//        } catch (Exception e) {
//            if (e.getMessage().equalsIgnoreCase("no such file")) {
//                isExist = false;
//            }
//        }
//        return isExist;
//    }
//}
